﻿/*
SINACOR - BMF&Bovespa
Arquivo: BloqueioValido.cs
Criado em: 08-jun-2010 17:14:32
Arquiteto Responsável: p-wgeneroso
*/
using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Common.Validation;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Validation.BusinessRules;


namespace Sinacor.Servico.Bovespa.ManutencaoOrdens.BusinessLogic.BusinessRulesValidation 
{
	public class BloqueioValido : BaseBusinessRuleValidation<BusinessEntity.Bloqueio>, IBusinessRuleValidation 
	{
		#region Métodos

		public List<ValidationError> GetErrors()
		{
            return this.ErrorsList;
		}

		public void Validate()
		{
            BusinessRulesValidator validador = new BusinessRulesValidator();
            ClienteDesbloqueadoNoCadastro validacaoClienteDesbloqueadoNoCadastro = null;
            CodigoGrupoAfinidadeInformado validacaoCodigoGrupoAfinidadeInformado = null;
            CodigoTipoClienteInformado validacaoCodigoTipoClienteInformado = null;
            CodigoAssessorInformado validacaoCodigoAssessorInformado = null;
            CodigoClienteInformado validacaoCodigoClienteInformado = null;
            AtivoInformado validacaoAtivoInformado = null;
            CodigoMercadoInformado validacaoCodigoMercadoInformado = null;
            ClienteBloqueioCadastrado validacaoClienteCadastrado = null;
            PeriodoBloqueioValido validacaoPeriodoBloqueioValido = null;

            try
            {
                //Validação de rule set
                SinacorValidation ruleSetvalidation = new SinacorValidation();
                ruleSetvalidation.Validate<BusinessEntity.Bloqueio>(this.EntityToValidate);
            }
            catch (ValidationException e)
            {
                this.AddValidationError(e.ValidationErrors);
            }

            try
            {
                //Valida se TipoBloqueio é igual a Cliente ou TipoCliente ou Assessor ou Afinidade
                if (this.EntityToValidate.Tipo == BusinessEntity.Enum.TipoBloqueio.Cliente ||
                    this.EntityToValidate.Tipo == BusinessEntity.Enum.TipoBloqueio.TipoCliente ||
                    this.EntityToValidate.Tipo == BusinessEntity.Enum.TipoBloqueio.Assessor ||
                    this.EntityToValidate.Tipo == BusinessEntity.Enum.TipoBloqueio.GrupoAfinidade)
                {
                    //Valida se TipoBloqueio é igual a Cliente
                    switch(this.EntityToValidate.Tipo)
                    {
                        case BusinessEntity.Enum.TipoBloqueio.Cliente:
                            //Valida CodigoClienteInformado
                            validacaoCodigoClienteInformado = new CodigoClienteInformado();
                            validacaoCodigoClienteInformado.EntityToValidate = this.EntityToValidate;

                            //Valida Cliente Cadastrado
                            validacaoClienteCadastrado = new ClienteBloqueioCadastrado();
                            validacaoClienteCadastrado.EntityToValidate = base.EntityToValidate;
                            
                            //Validar ClienteDesbloqueadoNoCadastro
                            validacaoClienteDesbloqueadoNoCadastro = new ClienteDesbloqueadoNoCadastro();
                            validacaoClienteDesbloqueadoNoCadastro.EntityToValidate = this.EntityToValidate;

                            validador.AddValidation("CodigoClienteInformado", validacaoCodigoClienteInformado);
                            validador.AddValidation("ClienteBloqueioCadastrado", validacaoClienteCadastrado);
                            validador.AddValidation("ClienteDesbloqueadoNoCadastro", validacaoClienteDesbloqueadoNoCadastro);

                            //Limpar campos
                            this.EntityToValidate.CodigoGrupoAfinidade = null;
                            this.EntityToValidate.CodigoAssessor = null;
                            this.EntityToValidate.CodigoTipoCliente = null;
                            break;

                        case BusinessEntity.Enum.TipoBloqueio.Assessor:
                            //Validar CodigoAssessorInformado
                            validacaoCodigoAssessorInformado = new CodigoAssessorInformado();
                            validacaoCodigoAssessorInformado.EntityToValidate = this.EntityToValidate;

                            validador.AddValidation("CodigoAssessorInformado", validacaoCodigoAssessorInformado);

                            //Limpar campos
                            this.EntityToValidate.CodigoGrupoAfinidade = null;
                            this.EntityToValidate.Cliente = new BusinessEntity.Cliente();
                            this.EntityToValidate.CodigoTipoCliente = null;
                            break;
                    
                        case BusinessEntity.Enum.TipoBloqueio.TipoCliente:
                            //Validar CodigoTipoClienteInformado
                            validacaoCodigoTipoClienteInformado = new CodigoTipoClienteInformado();
                            validacaoCodigoTipoClienteInformado.EntityToValidate = this.EntityToValidate;

                            validador.AddValidation("CodigoTipoClienteInformado", validacaoCodigoTipoClienteInformado);

                            //Limpar campos
                            this.EntityToValidate.CodigoGrupoAfinidade = null;
                            this.EntityToValidate.Cliente = new BusinessEntity.Cliente();
                            this.EntityToValidate.CodigoAssessor = null;
                            break;

                        case BusinessEntity.Enum.TipoBloqueio.GrupoAfinidade:
                            //Validar CodigoGrupoAfinidadeInformado
                            validacaoCodigoGrupoAfinidadeInformado = new CodigoGrupoAfinidadeInformado();
                            validacaoCodigoGrupoAfinidadeInformado.EntityToValidate = this.EntityToValidate;

                            validador.AddValidation("CodigoGrupoAfinidadeInformado", validacaoCodigoGrupoAfinidadeInformado);

                            //Limpar campos
                            this.EntityToValidate.CodigoTipoCliente = null;
                            this.EntityToValidate.Cliente = new BusinessEntity.Cliente();
                            this.EntityToValidate.CodigoAssessor = null;
                            break;
                    }
                }
                else
                {
                    //Valida se TipoBloqueio igual a Papel
                    switch(this.EntityToValidate.Tipo)
                    {
                        case BusinessEntity.Enum.TipoBloqueio.Papel:
                            //Validar AtivoInformado
                            validacaoAtivoInformado = new AtivoInformado();
                            validacaoAtivoInformado.EntityToValidate = this.EntityToValidate;

                            validador.AddValidation("AtivoInformado", validacaoAtivoInformado);
                            break;
                        case BusinessEntity.Enum.TipoBloqueio.Mercado:
                            //Validar MercadoInformado
                            validacaoCodigoMercadoInformado = new CodigoMercadoInformado();
                            validacaoCodigoMercadoInformado.EntityToValidate = this.EntityToValidate;

                            validador.AddValidation("CodigoMercadoInformado", validacaoCodigoMercadoInformado);
                            break;
                    }

                    //Limpar campos
                    this.EntityToValidate.CodigoGrupoAfinidade = null;
                    this.EntityToValidate.CodigoTipoCliente = null;
                    this.EntityToValidate.Cliente = new BusinessEntity.Cliente();
                    this.EntityToValidate.CodigoAssessor = null;
                }

                //Valida bloqueio valido
                validacaoPeriodoBloqueioValido = new PeriodoBloqueioValido();
                validacaoPeriodoBloqueioValido.EntityToValidate = this.EntityToValidate;
                validador.AddValidation("PeriodoBloqueioValido", validacaoPeriodoBloqueioValido);

                validador.Validate();
            }
            catch (ValidationException e)
            {
                this.AddValidationError(e.ValidationErrors);
            }
		}

		#endregion
	}

}